package ftps

import (
	"fmt"
	"io"
	"io/ioutil"
	"os"
	"path/filepath"

	"goftp.io/server/v2"
)

// CloudSDriver 分布式存储驱动器
type CloudSDriver struct {
	storageName string
	onPutFile   CloudSOnPutFile
}

func NewCloudSDriver(storageName string) *CloudSDriver {
	return &CloudSDriver{
		storageName: storageName,
	}
}

// 用于检查接口实现有没有完整，不对外暴露
func checkCloudSDriver() server.Driver {
	return &CloudSDriver{}
}

func (driver *CloudSDriver) Stat(ctx *server.Context, path string) (os.FileInfo, error) {
	return &CloudSFile{
		name:  driver.storageName,
		size:  0,
		isDir: true,
	}, nil
}

func (driver *CloudSDriver) ListDir(ctx *server.Context, path string, fileWriter func(os.FileInfo) error) error {
	//for i := 0; i < 10; i++ {
	//	file := &CloudSFile{
	//		name:  fmt.Sprintf("file%d", i),
	//		size:  int64(i*100 + 10),
	//		isDir: false,
	//	}
	//	err := fileWriter(file)
	//	if err != nil {
	//		return err
	//	}
	//}
	return nil
}

func (driver *CloudSDriver) DeleteDir(ctx *server.Context, path string) error {
	return fmt.Errorf("当前不支持删除文件夹")
}

func (driver *CloudSDriver) DeleteFile(ctx *server.Context, path string) error {
	return fmt.Errorf("当前不支持删除文件")
}

func (driver *CloudSDriver) Rename(ctx *server.Context, pathOld string, pathNew string) error {
	return fmt.Errorf("当前不支持文件重命名")
}

func (driver *CloudSDriver) MakeDir(ctx *server.Context, path string) error {
	return fmt.Errorf("当前不支持创建文件夹")
}

func (driver *CloudSDriver) GetFile(ctx *server.Context, path string, offset int64) (int64, io.ReadCloser, error) {
	return 0, nil, fmt.Errorf("当前不支持下载文件")
}

func (driver *CloudSDriver) PutFile(ctx *server.Context, path string, reader io.Reader, offset int64) (int64, error) {
	if offset > -1 {
		return 0, fmt.Errorf("offset非法")
	}
	buffer, err := ioutil.ReadAll(reader)
	if err != nil {
		return 0, fmt.Errorf("读取用户文件失败")
	}

	fileName := filepath.Base(path)
	writer, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		return 0, err
	}
	defer writer.Close()
	size, err := writer.Write(buffer)
	if err != nil {
		return 0, fmt.Errorf("写入文件失败")
	}
	driver.callOnCloudSPutFile(fileName, "/get/id"+fileName) // TODO: url
	return int64(size), nil
}
